package com.wang.crm.workbench.service.impl;

import com.wang.crm.utils.DateTimeUtil;
import com.wang.crm.utils.SqlSessionUtil;
import com.wang.crm.utils.UUIDUtil;
import com.wang.crm.workbench.dao.CustomerDao;
import com.wang.crm.workbench.dao.TranDao;
import com.wang.crm.workbench.dao.TranHistoryDao;
import com.wang.crm.workbench.domain.Customer;
import com.wang.crm.workbench.domain.Tran;
import com.wang.crm.workbench.domain.TranHistory;
import com.wang.crm.workbench.service.TranService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TranServiceImpl implements TranService {
    private TranDao tranDao = SqlSessionUtil.getSqlSession().getMapper(TranDao.class);
    private TranHistoryDao tranHistoryDao = SqlSessionUtil.getSqlSession().getMapper(TranHistoryDao.class);
    private CustomerDao customerDao = SqlSessionUtil.getSqlSession().getMapper(CustomerDao.class);

    public boolean save(Tran t, String customerName) {
        /*
        *   交易添加业务：
        *       再做添加之前 t 参数就少了一项信息，就是客户的主键，customerId
        *       先处理客户的相关需求
        *           1. 判断customerName,根据客户名称在客户表进行精确查询
        *               如果没有这个客户，则取出这个客户的id，封装到t对象中
        *               如果没有这个客户，则在客户表新建一条客户信息，然后将客户的信息取出，封装到t对象中
        *           2. 经过以上操作，t对象中的信息就全了，需要执行添加交易的操作
        *           3. 添加交易完毕后，需要创建一条交易历史
        *        * */

        boolean flag = true;

        Customer cus = customerDao.getCustomerByName(customerName);

        // 如果 cus 为 null ，需要创建客户
        if (cus == null) {
            cus = new Customer();
            cus.setId(UUIDUtil.getUUID());
            cus.setName(customerName);
            cus.setCreateBy(t.getCreateBy());
            cus.setCreateTime(DateTimeUtil.getSysTime());
            cus.setContactSummary(t.getContactSummary());
            cus.setNextContactTime(t.getNextContactTime());
            cus.setOwner(t.getOwner());

            // 添加客户
            int count1 = customerDao.save(cus);
            if (count1 != 1) {
                flag = false;
            }
        }

        // 通过对以上客户的处理，无论查询出来已有的客户，还是我们以前没有新增的客户，总之客户已存在，客户的ID有了
        // 将客户的 id 封装到 t 对象中
        t.setCustomerId(cus.getId());

        // 添加交易
        int count2 = tranDao.save(t);
        if (count2 != 1) {
            flag = false;
        }

        // 添加交易历史
        TranHistory th = new TranHistory();
        th.setId(UUIDUtil.getUUID());
        th.setTranId(t.getId());
        th.setStage(t.getStage());
        System.out.println(t.getStage());
        th.setMoney(t.getMoney());
        th.setExpectedDate(t.getExpectedDate());
        th.setCreateTime(DateTimeUtil.getSysTime());
        th.setCreateBy(t.getCreateBy());

        int count3 = tranHistoryDao.save(th);
        if (count3 != 1) {
            flag = false;
        }

        return flag;
    }

    public Tran detail(String id) {

        Tran t = tranDao.detail(id);

        return t;
    }

    public List<TranHistory> getHistoryListByTranId(String tranId) {

        List<TranHistory> thList = tranHistoryDao.getHistoryListByTranId(tranId);

        return thList;
    }

    public boolean changeStage(Tran t) {

        boolean flag = true;

        // 改变交易阶段
        int count1 = tranDao.changeStage(t);
        if (count1 != 1) {
            flag = false;
        }

        // 交易阶段改变后，生成一条交易历史
        TranHistory th = new TranHistory();
        th.setId(UUIDUtil.getUUID());
        th.setStage(t.getStage());
        th.setCreateBy(t.getEditBy());
        th.setCreateTime(DateTimeUtil.getSysTime());
        th.setExpectedDate(t.getExpectedDate());
        th.setMoney(t.getMoney());
        th.setTranId(t.getId());
        // 添加交易历史
        int count2 = tranHistoryDao.save(th);
        if (count2 != 1) {
            flag = false;
        }
        return flag;
    }

    public Map<String, Object> getCharts() {
        // 取得total
        int total = tranDao.getTotal();

        // 取得dataList
        List<Map<String,Object>> dataList = tranDao.getCharts();

        // 将total和dataList保存到map中
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("total",total);
        map.put("dataList",dataList);

        // 返回map
        return map;

    }

}
